package com.filter;

import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public abstract class AbstractValidator<R,T> implements Filter {
    public Collection doFilter(Collection coll) {
        if (CollectionUtils.isEmpty(coll)){
            return null;
        }
        //准备好要返回的数据类型
        List<R> rlist = new ArrayList<R>();
        //迭代器,遍历需要校验的所有数据
        Iterator iterator = coll.iterator();
        while(iterator.hasNext()){
            //获取集合中的数据
            T t = (T) iterator.next();
            //进行数据校验
            R r = validate(t);
            //如果数据不合法
            if (!isValid(r)){
                //添加到要返回的错误集合
                rlist.add(r);
                //从原集合中删除
                iterator.remove();

            }
        }
        return rlist;
    }
    /**
     * 针对于每条数据进行校验,返回该条数据的校验结果
     * @param dto  待校验的数据
     * @return     由于此方法需要被子类重写,因此这里只是返回null
     */
    protected R validate(T dto){
        return null;
    }

    /**
     * 是否合法,这里针对的是每一条数据
     * @param r  数据的校验结果
     * @return  依据数据的校验结果判断是否合法,合法则返回true
     */
    protected boolean isValid(R r){
        return r==null;
    }
}
